/*** 本文件由HaivDb4J2ee工具辅助生成，版本1.3.1 ***/

package com.ce.sys.org.action;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;

import com.ce.framework.constants.WebConstants;
import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.framework.datamaintain.logic.ISearchCondition;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.StringUtil;
import com.ce.framework.util.node.JsonTreeNode;
import com.ce.framework.util.node.TreeNodeProperty;
import com.ce.sys.org.dao.po.SysDep;
import com.ce.sys.org.dao.po.SysOrgMan;
import com.ce.sys.org.dao.po.SysOrgPro;
import com.ce.sys.org.dao.po.SysVOrg;
import com.ce.util.DictUtil;
import com.ce.util.OrgUtil;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：　andy
* 创建日期：2010-09-16
* 创建时间：08:37:11
* 功能描述：机构管理Action，包含生产部门和行政部门
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class SysOrgAction extends DataMaintainAction 
{
	private static final long serialVersionUID = 1L;

   private SysOrgMan orgMan ;  //根机构（段及段以上机构）
   
   private SysOrgPro orgPro;  //生产机构
   
   private SysDep    dep;     //行政机构
   
   
	/**
	 * 机构树的类型：dep:行政部门树  org：生产机构树 默认为org
	 */
  private String treeType = "";
  
  
	
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		setAttribute("treeType", "org");
		return this.openTreeFrame();
	}

	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-21 下午02:11:58
	 * 功能描述：打开机构管理界面
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openTreeFrame(){
	  	return "orgTreeFrame";
	  }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-9-21 上午09:42:38
     * 功能描述：选择机构树的节点后返回的查看页面
     * 方法的参数和返回值
     * @return
     * @throws AppException
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String openViewPage()throws AppException {
    	SysVOrg org = (SysVOrg)this.baselogic.getPOByPk(SysVOrg.class.getName(), this.getParameter("vcId"));
    	String pageUrlStr = "sysOrgManagerViewForDEP";   //页面的返回地址，默认为部门，因为部分部门的ManProType可能为空
    	//根据机构类型转向不同的操作页面
    	if(Integer.parseInt(org.getVcManProType())>=6){
    		SysOrgPro chooseOrg = (SysOrgPro)this.baselogic.getPOByPk(SysOrgPro.class.getName(), org.getVcId());
    		if(StringUtil.isNotBlank(chooseOrg.getVcClass()))
    		     chooseOrg.setVcClass(DictUtil.getDictItemByValueAndDictName(chooseOrg.getVcClass(), "机构管理_生产机构分类").getVcItemName());
    		setAttribute("org", chooseOrg);
    		pageUrlStr = "sysOrgManagerViewForORG";  //生产机构操作页面
    	}else{
    		SysDep chooseOrg = (SysDep)this.baselogic.getPOByPk(SysDep.class.getName(), org.getVcId());
    		//当用户点击根机构时可能为空，需要进行判断
    		if(chooseOrg!=null){
        		setAttribute("org", chooseOrg);
        		pageUrlStr = "sysOrgManagerViewForDEP";  //行政机构操作页面    			
    		}else{
    			SysOrgMan orgMan = (SysOrgMan)this.baselogic.getPOByPk(SysOrgMan.class.getName(), org.getVcId());
    			setAttribute("org", orgMan);  
    			pageUrlStr = "sysOrgManagerViewForRootOrg";   // 当前服务器所在机构的操作页面
    		}

    	}
    	return pageUrlStr;
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-9-16 下午04:12:49
     * 功能描述：生成Json格式的机构树
     * 方法的参数和返回值
     * @return
     * @throws AppException
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public void searchOrgJsonTree()throws  AppException{
    	List<?> orgList = new ArrayList<Object>();
    	JSONArray jsonTree = new JSONArray();
    	//获取当前服务器所在部门下的所有机构信息
    	SysVOrg rootOrg = OrgUtil.getRootOrg();
    	String baseSql = "select * from sys_v_org$dep T start with t.VC_ID='"+rootOrg.getVcId()+"' connect by PRIOR  t.VC_ID = t.vc_par$orgid";  //获取机构树的基本sql语句
    	StringBuffer sql  = new StringBuffer("select * from ("+baseSql+") where 1=1 ");
    	//根据treeType判断是现实生产机构树还是部门树
    	if("dep".equals(treeType)){
    		sql.append(" and VC_ORG$TYPE$FLAG = '3'"); //部门树
    		sql.append(" order by N_SEQ ASC,VC_NAME Asc");
    	}else if("org".equals(treeType)){
    		sql.append(" and VC_ORG$TYPE$FLAG = '2' ");  //生产机构树
    		sql.append(" order by N_SEQ ASC,VC_NAME Asc");
    	}else{
    		sql.append(" order by VC_ORG$LEVEL ASC,N_SEQ ASC");
    	}
    	//将通过SQL语句查询的结果集组合成SysVOrg对象的数组
    	orgList = this.baselogic.executeSQLQuery(sql.toString(),new ISQLMapper(){
			public SysVOrg fromSQLQuery(ResultSet rs, int row) {
				SysVOrg view = new SysVOrg();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcNumber(rs.getString("VC_NUMBER"));
					view.setVcOrgLevel(rs.getString("VC_ORG$LEVEL"));
					view.setNseq(rs.getInt("N_SEQ"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcType(rs.getString("VC_TYPE"));
					view.setVcDesc(rs.getString("VC_DESC"));
					view.setVcFlagLeaf(rs.getString("VC_FLAG$LEAF"));
					view.setVcParOrgid(rs.getString("VC_PAR$ORGID"));
					view.setNid(rs.getInt("N_ID"));			
					view.setVcManProType(rs.getString("VC_MAN$PRO$TYPE"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
    	//设置树的根节点的信息
    	JsonTreeNode rootNode = new JsonTreeNode();//根节点
    	rootNode.setId(rootOrg.getVcId());
    	rootNode.setText(rootOrg.getVcName());
    	TreeNodeProperty attributes = new TreeNodeProperty();
    	attributes.setOrgType(rootOrg.getVcManProType());
    	rootNode.setAttributes(attributes);
    	List<JsonTreeNode> childList = this.getChildNodeListForOrg(rootOrg.getVcId(),orgList);  //获取根节点下的全部节点信息
    	rootNode.setChildren(childList); //加载子节点
    	jsonTree.add(rootNode);  //写入树节点信息
    	//以字符串为文件流进行输出
		writeHTML(jsonTree.toString());  //将树以JSON格式的字符串进行输出
    }
    	
    
    /**
     * 开发人： andy
     * 开发时间： 2013-9-16 下午03:53:06
     * 功能描述：根据父节点的id获取子节点的机构树List，其中List中的对象为JsonTreeNode
     * 方法的参数和返回值
     * @param pid
     * @param orgList
     * @return
     * List 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    protected List<JsonTreeNode> getChildNodeListForOrg(String pid,List<?> orgList){
    	List<JsonTreeNode> rootList = new ArrayList<JsonTreeNode>();
    	//循环遍历所有机构
    	for(int i=0;i<orgList.size();i++){
    		SysVOrg org = (SysVOrg)orgList.get(i);
    		//判断机构信息，当机构的上级ID和参数pid相同时，才将该机构纳入到子节点中
    		if(pid.equals(org.getVcParOrgid())){
        		JsonTreeNode child = new JsonTreeNode();
            	child.setId(org.getVcId());
            	child.setText(org.getVcName());
            	TreeNodeProperty attributes = new TreeNodeProperty();
            	attributes.setOrgType(org.getVcManProType());
            	child.setAttributes(attributes);
            	List<JsonTreeNode> childList = this.getChildNodeListForOrg(org.getVcId(),orgList);  //递归获取的该节点的下级节点
            	child.setChildren(childList);
            	if(childList!=null&&childList.size()>0)  //当有子节点时默认树的状态为不展开
            	    child.setState("closed");
            	rootList.add(child); //将节点放入List数组中
    		}
    	}
    	return rootList;
    }


	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午03:23:39
	 * 功能描述：打开生产机构添加界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openOrgAddPage() throws AppException {
		// TODO Auto-generated method stub
		List<?> dictList = DictUtil.getDictListByName("机构管理_生产机构分类");
		setAttribute("dictList", dictList);
		String hql = "from SysOrgPro po where po.vcParOrgid = '"+this.getParameter("pid")+"' and po.vcDelFlag = 0";
		List<?> list = this.baselogic.searchByHql(hql);
		setAttribute("nseq", list.size());
		return "sysOrgManagerAddForOrgPage";
	}


	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午03:23:42
	 * 功能描述：打开生产机构修改界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openOrgModifyPage() throws AppException {
		// TODO Auto-generated method stub
		List<?> dictList = DictUtil.getDictListByName("机构管理_生产机构分类");
		setAttribute("dictList", dictList);
		this.orgPro = (SysOrgPro)this.baselogic.getPOByPk(SysOrgPro.class.getName(), getParameter("vcId"));
		return "sysOrgManagerModifyForOrgPage"; //打开生产机构修改界面
	}
    
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:51:22
	 * 功能描述： 删除生产机构
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String delOrg() throws AppException {
		// TODO Auto-generated method stub
		this.generateJsonOpeText("delete", new SysOrgPro());
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-25 上午11:08:19
	 * 功能描述：添加生产机构
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String addOrgForJS()throws AppException{
		//设置生产机构其他属性
		orgPro.setVcNumber("1");
		orgPro.setVcFlagLeaf("");
		orgPro.setVcOrgType("2");  //生产机构
		orgPro.setVcDelFlag(0);
		SysVOrg parOrg = (SysVOrg)this.baselogic.getPOByPk(SysVOrg.class.getName(), orgPro.getVcParOrgid());//上级机构
		//根据上级机构的类型判断增加的下级机构是何种类型
		if("5".equals(parOrg.getVcManProType())){  //添加车间
			orgPro.setVcType("6");
			orgPro.setVcLevel("4");
		}else{//添加工区
			orgPro.setVcType("7");
			orgPro.setVcLevel("5");
		}
		this.generateJsonOpeText("add", orgPro);
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-25 上午11:08:16
	 * 功能描述：修改生产机构
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String modifyOrgForJS(){
		this.generateJsonOpeText("modify", orgPro);
		return null;
	}

	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午03:21:29
	 * 功能描述：打开行政机构添加界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openDepAddPage() throws AppException {
		// TODO Auto-generated method stub
		String hql = "from SysDep po where po.vcParOrgid = '"+this.getParameter("pid")+"' and po.vcDelFlag = 0";
		List<?> list = this.baselogic.searchByHql(hql);
		setAttribute("nseq", list.size());
		return "sysOrgManagerAddForDepPage"; //打开行政机构添加界面
	}


	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午03:21:42
	 * 功能描述：打开行政机构修改界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openDepModifyPage() throws AppException {
		// TODO Auto-generated method stub
		this.dep = (SysDep)this.baselogic.getPOByPk(SysDep.class.getName(), getParameter("vcId"));
		return "sysOrgManagerModifyForDepPage"; //打开行政机构修改界面
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:51:22
	 * 功能描述： 删除行政机构
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String delDep() throws AppException {
		// TODO Auto-generated method stub
		this.generateJsonOpeText("delete", new SysDep());
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午03:57:48
	 * 功能描述：添加行政部门
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String addDepForJS(){
		//设置行政机构其他属性值
		dep.setVcNumber("1");
		dep.setVcLevel("3");
		dep.setVcFlagLeaf("");
        dep.setVcOrgType("3");
        dep.setVcDelFlag(0);
        dep.setVcType(null);
		this.generateJsonOpeText("add", dep);
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:51:50
	 * 功能描述：修改行政机构
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String modifyDepForJS(){
		this.generateJsonOpeText("modify", dep);
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:52:04
	 * 功能描述：打开根机构的添加下级界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openRootOrgAddPage()throws AppException{
		List<?> list = new ArrayList<Object>();
		if("dep".equals(this.getParameter("treeType"))){
			list = this.baselogic.searchByHql("from SysDep po where po.vcParOrgid = '"+this.getParameter("pid")+"' and po.vcDelFlag = 0");  //行政机构数量
		}else{
			List<?> dictList = DictUtil.getDictListByName("机构管理_生产机构分类");
			setAttribute("dictList", dictList);
			list  = this.baselogic.searchByHql("from SysOrgPro po where po.vcParOrgid = '"+this.getParameter("pid")+"' and po.vcDelFlag = 0"); //生产机构数量
		}
		setAttribute("nseq", list.size());
		return "sysOrgManagerAddForRootOrgPage";
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:54:53
	 * 功能描述：打开根机构的修改界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openRootOrgModifyPage() throws AppException {
		// TODO Auto-generated method stub
		this.orgMan = (SysOrgMan)this.baselogic.getPOByPk(SysOrgMan.class.getName(), getParameter("vcId"));
		return "sysOrgManagerModifyForRootOrgPage"; //打开行政机构修改界面
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:55:30
	 * 功能描述：增加根机构的下级部门
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String addRootOrgForJS()throws AppException{
		if("dep".equals(this.getParameter("treeType"))){
	       return this.addDepForJS();
		}else{
          return this.addOrgForJS();
		}
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-21 上午08:58:26
	 * 功能描述：修改根机构
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String modifyRootOrgForJS(){
		this.generateJsonOpeText("modify", orgMan);
		return null;
	}
	
    public void generateJsonOpeText(String opStr,Object org){
			String jsonText = "";
			try{
					if("add".equals(opStr)){
						this.baselogic.addPo(org);
						jsonText = "{\"opState\":\"success\"}";
					}else if("modify".equals(opStr)){
						this.baselogic.updatePo(org);
						jsonText = "{\"opState\":\"success\"}";
					}else if("delete".equals(opStr)){
						String[] delIds = this.getParameterValues(WebConstants.SELECT_ITEMS_NAME);
						//删除机构时默认的delId只有一个，所以可以只取第一个即可
						String orgId = delIds[0];
						int orgCnt = this.baselogic.getCntByHQL("from SysVOrg po  where  po.vcParOrgid = '"+orgId+"'");
						int personCnt = this.baselogic.getCntByHQL("from SysPerson po where po.vcOrgId = '"+orgId+"' and po.vcDelFlag = 0");
						if(orgCnt>0){
							jsonText = "{\"opState\":\"failure\",\"opInfo\":\"haveOrg\"}"; //存在子部门，不能删除
						}else if(personCnt>0){
							jsonText = "{\"opState\":\"failure\",\"opInfo\":\"haveUser\"}"; //存在部门人员，不能删除
						}else{
							this.baselogic.deleteLogic(org, delIds, WebConstants.DEFAULT_DELETE_FIELD,this.getParameter(WebConstants.CHILD_PO_NAME));//逻辑删除数据
							jsonText = "{\"opState\":\"success\"}";							
						}
					}
			}catch(Exception e){
				jsonText = "{\"opState\":\"failure\",\"opInfo\":\""+e.getMessage().replace("\"", "*")+"\"}";
			}finally{
				writeHTML(jsonText);
			}
    }

	public SysOrgMan getOrgMan() {
		return orgMan;
	}

	public void setOrgMan(SysOrgMan orgMan) {
		this.orgMan = orgMan;
	}

	public SysOrgPro getOrgPro() {
		return orgPro;
	}

	public void setOrgPro(SysOrgPro orgPro) {
		this.orgPro = orgPro;
	}

	public SysDep getDep() {
		return dep;
	}

	public void setDep(SysDep dep) {
		this.dep = dep;
	} 
    
	public String getTreeType() {
		return treeType;
	}

	public void setTreeType(String treeType) {
		this.treeType = treeType;
	}

	protected ISearchCondition creatMainPoCondition() throws AppException {
      // TODO Auto-generated method stub
      return null;
	}
	
}

